package com.kfm.base.stream;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class BirthDayUtil {

    /**
     * 根据身份证号码判断是否是生日
     * @param id  身份证号
     * @return true 今天是生日
     */
    public static boolean isBirth(String id){
        // 校验
        boolean matches = id.matches("^([1-6][1-9]|50)\\d{4}(18|19|20)\\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$");

        if (!matches){
            throw new RuntimeException("身份证号码不正确");
        }

        // 提取出生年月
        int year = Integer.parseInt(id.substring(6, 10));
        int month = Integer.parseInt(id.substring(10, 12));
        int days = Integer.parseInt(id.substring(12, 14));

        return isBirth(year, month, days);
    }

    /**
     * 根据 年 月 日 判断是否是今天过生日
     * @param year
     * @param month
     * @param days
     * @return
     */
    public static boolean isBirth(int year, int month, int days){
        // 判断是否是今天过生日
        Date date = new Date(year, month - 1, days);
        return isBirth(date);
    }

    /**
     * 根据日期字符串 判断是否今天过生日
     * @param date  yyyy-MM-dd
     * @return
     */
    public static boolean isBirthByStr(String date){
        boolean matches = date.matches("^\\d{4}-\\d{2}-\\d{2}");
        if (!matches){
            throw new IllegalArgumentException("日期格式不正确。应为 yyyy-MM-dd");
        }

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date parse = sdf.parse(date);
            return isOneDay(new Date(), parse);
//            return isBirth(parse);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }


    /**
     *  根据 出生的日期(Date) 对象， 判断是否是过生日
     * @param birthday
     * @return
     */
    public static boolean isBirth(Date birthday){
        return isOneDay(new Date(), birthday);
    }


    /**
     * 判断两个日期是不是同一天
     * @param date1
     * @param date2
     * @return
     */
    private static boolean isOneDay(Date date1, Date date2){
        return date1.getMonth() == date2.getMonth() && date1.getDate() == date2.getDate();
    }


    public static boolean isAfterWeekDay(Date date1){
        // 今天
        Date today = new Date();
        // 7 天后
        Date afterWeek = new Date();
        afterWeek.setDate(afterWeek.getDate() + 7);


        return date1.after(today) && date1.before(afterWeek);
    }
}
